package org.dkakunsi.aplikasitoko.form.kasir;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import org.dkakunsi.aplikasitoko.data.entity.Barang;
import org.dkakunsi.aplikasitoko.data.entity.Pelaku;
import org.dkakunsi.aplikasitoko.data.entity.Transaksi;
import org.dkakunsi.aplikasitoko.data.entity.TransaksiBarang;
import org.dkakunsi.aplikasitoko.data.util.ApplicationDataException;
import org.dkakunsi.aplikasitoko.form.Desktop;
import org.dkakunsi.aplikasitoko.form.MyForm;
import org.dkakunsi.aplikasitoko.service.DataService;

public class Penjualan extends MyForm implements ItemListener {

	private static final long serialVersionUID = 1L;

	private JLabel labelIdBarang;
	private JLabel labelNamaBarang;
	private JLabel labelJumlahBarang;
	private JLabel labelPembayaran;
	private JLabel labelKembalian;
	private JLabel labelJenisPembayaran;
	private JLabel labelTotal;
	private JLabel labelTotalBayar;
	private JTextField textFieldIdBarang;
	private JTextField textFieldNamaBarang;
	private JTextField textFieldJumlahBarang;
	private JTextField textFieldPembayaran;
	private JTextField textFieldKembalian;
	private JComboBox<String> comboJenisPembayaran;
	private JButton btnCari;
	private JButton btnTambah;
	private JButton btnHitungKembalian;
	private JButton btnOK;
	private String[] kolom = {"ID Barang", "Nama Barang", "Jumlah", "Bayar"};
	private List<TransaksiBarang> listTransaksiBarang = new ArrayList<>();
	private List<Barang> listBarang = new ArrayList<>();
	private Barang barang;
	private double jumlahTransaksi;
	private double jumlahBayar;

	/**
	 * create frame with no desktop initialized
	 * @param judul
	 */
	public Penjualan(String judul) {
		super(judul);
		setter();
	}

	/**
	 * create frame with desktop initialized
	 * @param judul
	 * @param desktop
	 */
	public Penjualan(String judul, Desktop desktop) {
		super(judul, desktop);
		setter();
	}

	private void setter(){
		this.setUkuran(940, 405);
//		this.setUkuranTable(500, 350);
		this.setUkuranTable(12, 50, 500, 300);
		this.setBtnExit(820, 335);
		this.setTableModel(kolom);

		labelTotal = new JLabel("Total Bayar : ");
		Font labelTotalFont = new Font(labelTotal.getFont().getName(),labelTotal.getFont().getStyle(),22);
		labelTotal.setFont(labelTotalFont);
		labelTotal.setBounds(12, 5, 150, 45);
		getContentPane().add(labelTotal);
		
		labelTotalBayar = new JLabel("xxx");
		Font labelTotalBayarFont = new Font(labelTotalBayar.getFont().getName(),labelTotalBayar.getFont().getStyle(),22);
		labelTotalBayar.setFont(labelTotalBayarFont);
		labelTotalBayar.setBounds(175, 5, 150, 45);
		getContentPane().add(labelTotalBayar);
		
		labelIdBarang = new JLabel("ID Barang");
		labelIdBarang.setBounds(525, 12, 150, 25);
		getContentPane().add(labelIdBarang);
		
		textFieldIdBarang = new JTextField();
		textFieldIdBarang.setBounds(690, 12, 120, 25);
		getContentPane().add(textFieldIdBarang);

		btnCari = new JButton("CARI");
		btnCari.setBounds(820, 12, 100, 25);
		getContentPane().add(btnCari);
		btnCari.setActionCommand("CARI");
		btnCari.addActionListener(this);
		
		labelNamaBarang = new JLabel("Nama Barang");
		labelNamaBarang.setBounds(525, 47, 150, 25);
		getContentPane().add(labelNamaBarang);
		
		textFieldNamaBarang = new JTextField();
		textFieldNamaBarang.setBounds(690, 47, 230, 25);
		getContentPane().add(textFieldNamaBarang);
		
		labelJumlahBarang = new JLabel("Jumlah Barang");
		labelJumlahBarang.setBounds(525, 82, 150, 25);
		getContentPane().add(labelJumlahBarang);

		textFieldJumlahBarang = new JTextField();
		textFieldJumlahBarang.setBounds(690, 82, 230, 25);
		getContentPane().add(textFieldJumlahBarang);

		btnTambah = new JButton("TAMBAH");
		btnTambah.setBounds(690, 117, 120, 25);
		getContentPane().add(btnTambah);
		btnTambah.setActionCommand("TAMBAH");
		btnTambah.addActionListener(this);
		
		labelJenisPembayaran = new JLabel("Jenis Pembayaran");
		labelJenisPembayaran.setBounds(525, 195, 150, 25);
		getContentPane().add(labelJenisPembayaran);
		
        String[] jenis = {"","Tunai","Kartu Kredit"};
		comboJenisPembayaran = new JComboBox<>(jenis);
		comboJenisPembayaran.setBounds(690, 195, 230, 25);
		getContentPane().add(comboJenisPembayaran);
		comboJenisPembayaran.addItemListener(this);

		labelPembayaran = new JLabel("Pembayaran");
		labelPembayaran.setBounds(525, 230, 150, 25);
		getContentPane().add(labelPembayaran);
		
		textFieldPembayaran = new JTextField();
		textFieldPembayaran.setBounds(690, 230, 120, 25);
		getContentPane().add(textFieldPembayaran);
		
		btnHitungKembalian = new JButton("HITUNG");
		btnHitungKembalian.setBounds(820, 230, 100, 25);
		getContentPane().add(btnHitungKembalian);
		btnHitungKembalian.setActionCommand("HITUNG");
		btnHitungKembalian.addActionListener(this);

		labelKembalian = new JLabel("Kembalian");
		labelKembalian.setBounds(525, 265, 150, 25);
		getContentPane().add(labelKembalian);
		
		textFieldKembalian = new JTextField();
		textFieldKembalian.setBounds(690, 265, 230, 25);
		getContentPane().add(textFieldKembalian);
		
		btnOK = new JButton("OK");
		btnOK.setBounds(820, 300, 100, 25);
		getContentPane().add(btnOK);
		btnOK.setActionCommand("OK");
		btnOK.addActionListener(this);
		
		ds = new DataService();
		initButtonView();
		initTextFieldView();
		jumlahTransaksi = 0.0;
	}
	
	private void initButtonView(){
		btnCari.setEnabled(true);
		btnTambah.setEnabled(false);
		btnHitungKembalian.setEnabled(true);
		btnOK.setEnabled(true);
	}
	
	private void initTextFieldView(){
		this.textFieldIdBarang.setText("");
		this.textFieldNamaBarang.setText("");
		this.textFieldJumlahBarang.setText("");
		this.textFieldPembayaran.setText("");
		this.textFieldKembalian.setText("");
		this.comboJenisPembayaran.setSelectedItem("");

		this.textFieldIdBarang.setEnabled(true);
		this.textFieldNamaBarang.setEnabled(true);
		this.textFieldJumlahBarang.setEnabled(false);
		this.comboJenisPembayaran.setEnabled(true);
		this.textFieldPembayaran.setEnabled(false);
		this.textFieldKembalian.setEnabled(true);
		this.textFieldKembalian.setEditable(false);
		
		this.textFieldIdBarang.requestFocus();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		
		switch(command){
			case "EXIT" : exit();
				break;
			case "CARI" : 
				String param = null;
				String idBarang = this.textFieldIdBarang.getText();
				String namaBarang = this.textFieldNamaBarang.getText();
				
				try {
					if( !idBarang.equals("") ) {
						param = this.textFieldIdBarang.getText();
						barang = (Barang) ds.getInstance( param, "BARANG" );
					} else if ( !namaBarang.equals("") ) {
						param = textFieldNamaBarang.getText();
						barang = (Barang) ds.getBy( param, "BARANG" );
					} else {
						JOptionPane.showMessageDialog( this, "Kode/Nama Barang tidak boleh kosong", "Peringatan", JOptionPane.WARNING_MESSAGE );
						break;
					}
				
					this.textFieldIdBarang.setText( barang.getKode() );
					this.textFieldNamaBarang.setText( barang.getNama() );
					this.textFieldJumlahBarang.setEnabled( true );
					this.btnTambah.setEnabled( true );
				} catch ( ApplicationDataException e1 ) {
					JOptionPane.showMessageDialog( this, e1.getMessage(), "Kesalahan Pencarian", JOptionPane.ERROR_MESSAGE );
					//e1.printStackTrace();
				}
				break;
			case "TAMBAH" : 
				TransaksiBarang transaksiBarang = new TransaksiBarang();
				transaksiBarang.setBarang( barang );
				transaksiBarang.setJumlahBarang( Integer.parseInt( textFieldJumlahBarang.getText() ) );
				barang.kurangJumlahBarang( Integer.parseInt( textFieldJumlahBarang.getText() ) );
//				ds.attach(barang);
//				barang.addTransaksiBarang(transaksiBarang);
//				ds.stop();
				
				listTransaksiBarang.add( transaksiBarang );
				listBarang.add(barang);
				loadView();
				initTextFieldView();
				
				int lastRow = tabModel.getRowCount()-1;
				int lastColumn = tabModel.getColumnCount()-1;
				String totBayar = (String) tabModel.getValueAt(lastRow, lastColumn);
				labelTotalBayar.setText(totBayar);
				break;
			case "HITUNG" : 
				jumlahBayar = Double.parseDouble( textFieldPembayaran.getText() );
				Double kembalian = hitungKembalian( jumlahBayar );
				this.textFieldKembalian.setText( kembalian.toString() );
				break;
			case "OK" : 
				Pelaku pelaku = this.getParentForm().getPelaku();
				Transaksi transaksi = new org.dkakunsi.aplikasitoko.data.entity.Penjualan();
				transaksi.setJenisTransaksi( "Penjualan" );
				transaksi.setJumlahTransaksi( jumlahTransaksi );
				transaksi.setJumlahBayar( jumlahBayar );
				
				ds.attach(pelaku);
				pelaku.addTransaksi(transaksi);
				ds.stop();
				
				Iterator<TransaksiBarang> itL = listTransaksiBarang.iterator();
				setBarang(); // baru tambah
				//ds.attach(transaksi);
				while( itL.hasNext() ) {
					TransaksiBarang transaksiBarangFound = ( TransaksiBarang ) itL.next();
					transaksi.addTransaksiBarang( transaksiBarangFound );
				}

				try {
//					ds.update(barang);
					ds.save(transaksi);
					showReport(transaksi);
					
//					JOptionPane.showMessageDialog( this, "Transaksi tersimpan", "Pemberitahuan", JOptionPane.INFORMATION_MESSAGE );
					initTextFieldView();
				} catch (ApplicationDataException e1) {
					JOptionPane.showMessageDialog(this, "Call the Developer", "Application Error", JOptionPane.ERROR_MESSAGE);
					//e1.printStackTrace();
				}
				break;
			default :
				break;
		}

	}
	
	private void setBarang(){
		for(int i=0; i<listBarang.size(); i++){
			Barang barangFound = (Barang) listBarang.get(i);
			ds.attach(barangFound);
			TransaksiBarang tbFound = (TransaksiBarang) listTransaksiBarang.get(i);
			barangFound.addTransaksiBarang(tbFound);
			ds.stop();
		}
	}

	@Override
	public void itemStateChanged(ItemEvent ie) {
		String str = (String) ie.getItem();
		
		switch(str){
			case "Tunai" :
				this.textFieldPembayaran.setEnabled(true);
				this.textFieldKembalian.setText("");
				break;
			case "Kartu Kredit" :
				String nomorPin = JOptionPane.showInputDialog(this, "Masukan Nomor PIN", "Masukan PIN", JOptionPane.QUESTION_MESSAGE);
				@SuppressWarnings("unused")
				String pswd = JOptionPane.showInputDialog(this, "Masukan password untuk PIN " + nomorPin, "Masukan Password", JOptionPane.QUESTION_MESSAGE);
				pswd = null; // langsung hapus object pswd
				this.textFieldPembayaran.setEnabled(false);
				this.textFieldPembayaran.setText(String.valueOf(jumlahTransaksi));
				this.textFieldKembalian.setText("0");
				jumlahBayar = jumlahTransaksi;
				break;
			default :
				break;
		}
		str=null;
	}

	@Override
	protected void loadInitialize() {
		// TODO Auto-generated method stub
		
	}

	@Override
	protected void loadView() {
		this.setTableModel( kolom );

		Iterator<TransaksiBarang> itL = listTransaksiBarang.iterator();
		
		jumlahTransaksi = 0.0;
		while(itL.hasNext()){
			TransaksiBarang transaksiBarangFound = ( TransaksiBarang ) itL.next();
			Barang barangFound = transaksiBarangFound.getBarang();
			try {
				jumlahTransaksi += transaksiBarangFound.getJualJumlahBayar();
				String[] data = { barangFound.getKode(), barangFound.getNama(), transaksiBarangFound.getJumlahBarang().toString(), transaksiBarangFound.getJualJumlahBayar().toString() };
				tabModel.addRow( data );
			} catch ( NullPointerException exc ){
				JOptionPane.showMessageDialog( this, "NullPointerException @DataBarang.loadView()", "Debugging", JOptionPane.DEFAULT_OPTION );
				exc.printStackTrace();
			}
		}
		String[] data = { "", "", "TOTAL", String.valueOf( jumlahTransaksi ) };
		tabModel.addRow( data );
	}

	private Double hitungKembalian(Double pembayaran) {
		return pembayaran - jumlahTransaksi;
	}

	private void showReport(Transaksi transaksi) {
		PanelStruk report = new PanelStruk(transaksi);
		getParentForm().getDesktopPane().add(report);
		report.show();
	}
}
